import axios from 'axios'
import { VueAxios } from './axios'

import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

import store from '../store'

// 创建 axios 实例
const service = axios.create({
    baseURL: process.env.VUE_APP_SERVER_HOST + process.env.VUE_APP_SERVER_API_PREFIX || '/',
    timeout: 64 * 2000
})

// 创建请求队列和取消请求的构造函数
const requestQueue = []
const CancelToken = axios.CancelToken

// 队列处理
const queueHandler = (config, c) => {
  const urlFlag = config.url + '&' + config.method
  if (requestQueue.indexOf(urlFlag) !== -1) {
    if (c) {
      c()
    } else {
      requestQueue.splice(requestQueue.indexOf(urlFlag), 1)
    }
  } else {
    if (c) {
      requestQueue.push(urlFlag)
    }
  }
}

// 统一错误处理
const errHandler = (err) => {
    // // 结束动画
    // NProgress.done()

    // // 项目级操作：统一提示并转成常规错误返回给请求者
    // let errMsg = err.message || '未知错误'
    // // Vue.prototype.$message.error(errMsg)

    // // 如果本地获取不到cookie，则视为已丢失登录状态
    // if (!Cookies.get(LS_AUTH_INFO) && store.getters.authInfo.token){
    //   store.dispatch('logout')
    // }
    // return { code: 1000, msg: errMsg }

    // 常规操作：抛出这个异常，谁请求谁用catch捕获
    return Promise.reject(err)
}

// 请求拦截
service.interceptors.request.use(req => {
    // 请求队列拦截
    // req.cancelToken = new CancelToken(c => {
    //   queueHandler(req, c)
    // })


    NProgress.start()

    // // 如有有token则添加到headers中，url以http开头的视为站外接口，不带token
    // let notServerUrl = req.url.indexOf('http') === 0

    // // 改为从cookie获取用户授权信息
    // let authInfo
    // let authInfoCookie = Cookies.get(LS_AUTH_INFO)
    // if(authInfoCookie){
    //   authInfo = JSON.parse(authInfoCookie)
    // }
    // if (!notServerUrl && authInfo && authInfo.token) {
    //     // 与后端约定token的携带形式
    //     req.headers['Authorization'] = authInfo.token
    // } else {
    //     req.headers['Authorization'] = ""
    // }

    // console.log('请求内容：', req)
    return req
}, errHandler)

// 响应拦截
service.interceptors.response.use((res) => {

    // 队列处理
    // queueHandler(res.config)
    // console.log('请求返回结果：', res)
    NProgress.done()

    // // 对于正常响应，但响应的错误消息，这里要通知下
    // if(res.data.code){
    //     // Vue.prototype.$message.error(res.data.msg)
    //     // 与后端约定，token无效返回特定错误码，无效后触发注销
    //     if(res.data.code === 1001){
    //         store.dispatch('logout')
    //         return false
    //     }
    // }
    // // 如果当前token快过期了，这里调用一下token续期操作
    // const nowTime = new Date().valueOf()
    // const tokenIat = store.getters.authInfo.tokenIat || nowTime
    // const tokenExp = store.getters.authInfo.tokenExp || nowTime
    // // 定义需要开始更新token的时间，规则按照token时效，按比例计算，最后25%的时段
    // const refreshTime = parseInt(tokenExp - (tokenExp - tokenIat) * 0.25)
    // // 当前时间小于到期时间，且大于续期时间时，就会调用续期操作
    // if(nowTime < tokenExp && nowTime > refreshTime){
    //     store.dispatch('refreshToken')
    // }
    // 正常返回数据
    return res.data
}, errHandler)

const installer = {
    vm: {},
    install(Vue) {
        Vue.use(VueAxios, service)
    }
}

export {
    installer as VueAxios,
    service as axios
}
